<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'main.php';

/**
 * Controller para ações de grupo
 * 
 * @author Douglas Rafael
 * @package controllers     
 */
class Grupo extends Main {

    public function __construct() {
        parent::__construct();
        //Verifica se o usuário estar logado no sistema
        $this->verificaLogado();
        
        // Carrega class necessárias
        $this->load->model('DAOGrupo');
        $this->load->helper('text');

        //Seta propriedades do template
        $this->template->set('title', 'Cadastro de Grupo || ' . $this->title);
        $this->template->set('page_title', 'Cadastro de Grupo');
        $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p>Não é permitido cadastro duplicado de <span class="bold">GRUPOS</span>, então verifique se o grupo a ser inserido não possui cadastro.</p>
                        <p><span class="bold">Só é possível excluir um GRUPO se ele não estiver relacionado com nenhum usuário.</span></p>
                        <p class="bold"><span class="bold">ALT + N</span> Abre o formulário para cadastrar um novo grupo.</p>
                        <p><span class="bold">ESC</span> Fecha o formulário.</p>
                        <p><span class="bold">Duplo clique</span> sobre o registro, abre formulário para edição dos dados.</p>');
    }

    public function index() {
        $this->listar();
    }

    /**
     * Carrega a view com a lista de grupos
     */
    public function listar() {
        try {
            $this->verificaPermissao(ControleAcesso::CONSULTAR_GRUPO);
            // Removendo a variavel 'searchterm' da sessão
            $this->session->unset_userdata('searchterm');

            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $grupos = $this->DAOGrupo->select_all_groups($init, $total_pagina, $this->order_by, $this->direction);
            $total_rows = $this->DAOGrupo->amount_all_groups();
            
            //Todas as acoes cadastradas no sistema
            $this->load->model('DAOAcao');
            $acoes = $this->DAOAcao->select_all_actios();
            
            // paginação
            $config['uri_segment'] = 6;
            $config['base_url'] = base_url() . "grupo/listar/" . $this->order_by_name . '/' . $this->direction_name . '/' . $total_pagina;
            $config['total_rows'] = $total_rows;
            $config['per_page'] = $total_pagina;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['grupos'] = $grupos;
            $data['acoes'] = $acoes;
            $data['quant_list'] = $total_pagina;

            $this->template->load(NULL, 'grupo_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_group();
        }
    }
    
    
    /**
     * Retorna via json o grupo selecionado
     */
    public function get_group_json() {
        try {
            $this->load->library('form_validation');
            $this->form_validation->set_rules("idGrupo", "Código", "trim|required|min_length[6]|max_length[6]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                echo validation_errors();
            } else {
                $grupo = new TOGrupo();
                $grupo->id = $this->input->post('idGrupo', TRUE);

                $data['grupo'] = $this->DAOGrupo->get_group($grupo);
                $data['super_admin'] = $this->verificaAcaoSuper();
                echo json_encode($data);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_group();
        }
    }
    
    /**
     * Cadastra grupo
     * 
     * @throws ExceptionValidacao
     */
    public function cadastrar() {
        try {
            $this->verificaPermissao(ControleAcesso::CADASTRAR_GRUPO);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("nome", "Nome", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("descricao", "Descrição", "trim|required|min_length[5]|max_length[245]|xss_clean");
            $this->form_validation->set_rules("acoes_id", "Ações", "trim|required|xss_clean");
            $this->form_validation->set_rules("status", "Status", "trim|is_natural|min_length[1]|max_length[1]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $grupo = new TOGrupo();
                $grupo->nome = $this->input->post('nome', TRUE);
                $grupo->descricao = $this->input->post('descricao', TRUE);
                $grupo->status = $this->input->post('status', TRUE);
                
                /**
                 * Preparando as ações do grupo
                 */
                $acoes = explode(',', $this->input->post('acoes_id', TRUE));
                $grupo->acoes = array();
                foreach ($acoes as $acao_vez){
                    $acao_grupo = new TOAcao();
                    $acao_grupo->id = $acao_vez;
                    array_push($grupo->acoes , $acao_grupo);
                }
                
                $this->DAOGrupo->insert_group($grupo);

                Mensagem::setMensagemSucesso("Grupo: <span class='bold'>" . $grupo->nome . "</span> cadastrado com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    
    /**
     * Atualiza dados do grupo
     * 
     * @throws ExceptionValidacao
     */ 
    public function atualizar() {
        try {
            $this->verificaPermissao(ControleAcesso::ATUALIZAR_GRUPO);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("nome", "Nome", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("descricao", "Descrição", "trim|required|min_length[5]|max_length[245]|xss_clean");
            $this->form_validation->set_rules("acoes_id", "Ações", "trim|required|xss_clean");
            $this->form_validation->set_rules("status", "Status", "trim|is_natural|min_length[1]|max_length[1]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $grupo = new TOGrupo();
                $grupo->id = $this->input->post('codigo', TRUE);
                $grupo->nome = $this->input->post('nome', TRUE);
                $grupo->descricao = $this->input->post('descricao', TRUE);
                $grupo->status = $this->input->post('status', TRUE);
                
                /**
                 * Preparando as ações do grupo
                 */
                $acoes = explode(',', $this->input->post('acoes_id', TRUE));
                $grupo->acoes = array();
                foreach ($acoes as $acao_vez){
                    $acao_grupo = new TOAcao();
                    $acao_grupo->id = $acao_vez;
                    array_push($grupo->acoes , $acao_grupo);
                }
                
                $this->DAOGrupo->update_group($grupo);

                Mensagem::setMensagemSucesso("Grupo: <span class='bold'>" . $grupo->nome . "</span> atualizado com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    
    /**
     * Busca grupo
     */
    public function buscar() {
        try {
            $searchterm = $this->searchtermHandler($this->input->get_post('search_term', TRUE));
            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $grupos = $this->DAOGrupo->search_group($init, $total_pagina, $searchterm, $this->order_by, $this->direction);
            $total_rows = $this->DAOGrupo->amount_search_group($searchterm);

            //Todas as acoes cadastradas no sistema
            $this->load->model('DAOAcao');
            $acoes = $this->DAOAcao->select_all_actios();

            //paginação
            $config['uri_segment'] = 6;
            $config['per_page'] = $total_pagina;
            $config['base_url'] = base_url() . "grupo/buscar/" . $this->order_by_name . "/" . $this->direction_name . "/". $total_pagina;
            $config['total_rows'] = $total_rows;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['grupos'] = $grupos;
            $data['acoes'] = $acoes;
            $data['quant_list'] = $total_pagina;

            if ($total_rows == 0)
                Mensagem::setMensagem("Nenhum registro foi encontrado para esta pesquisa: <span class='bold'> $searchterm </span>", "aviso");

            $this->template->load(NULL, 'grupo_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->listar();
        }
    }
    
    
    /**
     * Exclui grupo
     */
    public function excluir() {
        try {
            $this->verificaPermissao(ControleAcesso::EXCLUIR_GRUPO);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigoDelete", "Código", "trim|required|xss_clean");
            $this->form_validation->set_rules("nomeDelete", "Nome", "trim|min_length[2]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $grupo = new TOGrupo();
                $grupo->id = explode(',', $this->input->post('codigoDelete', TRUE));
                $grupo->nome = $this->input->post('nomeDelete', TRUE);

                $this->DAOGrupo->delete_group($grupo);

                $grupo->nome != NULL ? Mensagem::setMensagemSucesso("Grupo: <span class='bold'>" . $grupo->nome . "</span> excluído com sucesso!") : Mensagem::setMensagemSucesso("Grupos excluídos com sucesso!");

                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    
    private function view_list_group() {
        $this->template->load(NULL, 'usuario_list');
    }

}
